#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/wait.h>

int main(int argc,char* argv[],char* envp[])
{
    printf("我是一个进程，pid:%d\n",getpid());
    pid_t id = fork();

    sleep(1);
    if(id == 0)
    {
        printf("我是子进程！ppid: %d, pid: %d\n",getppid(),getpid());
        sleep(1);
        
        // 创建新的环境变量数组，添加当前目录到PATH
        char new_path[1024];
        char *old_path = getenv("PATH");  // 获取原来的PATH
    
        if(old_path)
        {
            snprintf(new_path, sizeof(new_path), "PATH=%s:/home/xiaodu/GLearn/Linux_L/learn15", old_path);
        }
        else
        {
            snprintf(new_path, sizeof(new_path), "PATH=/home/xiaodu/GLearn/Linux_L/learn15");
        }
    
        // 创建新的环境变量数组
        char *new_envp[] = {
            new_path,
            "HOME=/home/xiaodu",
            "USER=xiaodu",
            NULL
        };
    
        // 创建参数数组（execve需要）
        char *argv[] = {
            "code",  // 程序名
            NULL     // 必须以NULL结束
        };
        
        // 使用execve替换程序
        int ret = execve("code",argv,new_envp);//两种方法这里都可以，上面的更加简洁
        //int ret = execve("/home/xiaodu/GLearn/Linux_L/learn15/code", argv, new_envp);
        printf("子进程程序替换失败！ret = %d\n",ret);
        exit(1);
    }
    else if(id > 0)
    {
        // 父进程
        int status = 0;
        waitpid(id, &status, 0);  // 等待子进程结束
        printf("父进程运行结束！pid:%d，子进程退出状态:%d\n",getpid(),status);
    }
    else
    {
        // fork失败
        perror("fork failed");
    }

    return 0;
}

//int main(int argc,char* argv[],char* envp[])
//{
//    printf("我是一个进程，pid:%d\n",getpid());
//    pid_t id = fork();
//
//    sleep(1);
//
//    if(id == 0)
//    {
//        printf("我是子进程！ppid：%d，pid：%d\n",getppid(),getpid());
//        sleep(1);
//        // 创建新的环境变量数组，添加当前目录到PATH
//        char new_path[1024];
//        char *old_path = getenv("PATH");  // 获取原来的PATH
//        
//        if(old_path) 
//        {
//            snprintf(new_path, sizeof(new_path), "PATH=%s:/home/xiaodu/GLearn/Linux_L/learn15", old_path);
//        }
//        else 
//        {
//            snprintf(new_path, sizeof(new_path), "PATH=/home/xiaodu/GLearn/Linux_L/learn15");
//        }
//        
//        // 创建新的环境变量数组
//        char *new_envp[] = {
//            new_path,
//            "HOME=/home/xiaodu",
//            "USER=xiaodu",
//            NULL
//        };
//
//        int ret = execle("code","code",NULL,new_envp);
//        printf("子进程程序替换失败！ret = %d\n",ret);
//        exit(1);
//    }
//    else if(id > 0)
//    {
//        // 父进程
//        int status = 0;
//        waitpid(id, &status, 0);  // 等待子进程结束
//        printf("父进程运行结束！pid:%d，子进程退出状态:%d\n",getpid(),status);
//    }
//    else
//    {
//        // fork失败
//        perror("fork failed");
//    }
//
//    return 0;
//}
//
//

//int main(int argc,char* argv[],char* envp[])
//{
//    printf("我是一个进程，pid:%d\n",getpid());
//    pid_t id = fork();
//
//    sleep(1);
//
//    if(id == 0)
//    {
//        printf("我是子进程！ppid：%d，pid：%d\n",getppid(),getpid());
//        sleep(1);
//        //int ret = execle("/usr/bin/ls","ls","-l","-a",NULL,envp);
//        int ret = execle("./code","code",NULL,envp);
//        printf("子进程程序替换失败！ret = %d\n",ret);
//        exit(1);
//    }
//    else if(id > 0)
//    {
//        // 父进程
//        int status = 0;
//        waitpid(id, &status, 0);  // 等待子进程结束
//        printf("父进程运行结束！pid:%d，子进程退出状态:%d\n",getpid(),status);
//    }
//    else
//    {
//        // fork失败
//        perror("fork failed");
//    }
//
//    return 0;
//}



//int main()
//{
//    printf("我是一个进程，pid:%d\n",getpid());
//    pid_t id = fork();
//
//    sleep(1);
//
//    if(id == 0)
//    {
//        printf("我是子进程！ppid：%d，pid：%d\n",getppid(),getpid());
//        sleep(1);
//        char* argv[]={(char*)"code",NULL};
//        int ret = execvp("code",argv);
//        printf("子进程程序替换失败！ret = %d\n",ret);
//        exit(1);
//    }
//    else if(id > 0)
//    {
//        // 父进程
//        int status = 0;
//        waitpid(id, &status, 0);  // 等待子进程结束
//        printf("父进程运行结束！pid:%d，子进程退出状态:%d\n",getpid(),status);
//    }
//    else
//    {
//        // fork失败
//        perror("fork failed");
//    }
//
//    return 0;
//}



//int main()
//{
//    printf("我是一个进程，pid:%d\n",getpid());
//    pid_t id = fork();
//
//    sleep(1);
//
//    if(id == 0)
//    {
//        printf("我是子进程！ppid：%d，pid：%d\n",getppid(),getpid());
//        sleep(1);
//       // int ret = execlp("ls","ls","-l","-a",NULL);
//        int ret = execlp("code","code",NULL);
//        printf("子进程程序替换失败！ret = %d\n",ret);
//        exit(1);
//    }
//    else if(id > 0)
//    {
//        // 父进程
//        int status = 0;
//        waitpid(id, &status, 0);  // 等待子进程结束
//        printf("父进程运行结束！pid:%d，子进程退出状态:%d\n",getpid(),status);
//    }
//    else
//    {
//        // fork失败
//        perror("fork failed");
//    }
//
//    return 0;
//}

//int main()
//{
//    printf("我是一个进程，pid:%d\n",getpid());
//    sleep(1);
//   // char* argv[]={(char*)"ls",(char*)"-l",(char*)"-a",NULL};
//    char* argv[]={(char*)"code",NULL};
//    int ret = execv("./code",argv);
//    //int ret = execv("/usr/bin/ls",argv);
//
//    printf("运行结束了！ret = %d\n",ret);
//
//    return 15;
//}
//int main()
//{
//    printf("我是一个进程，pid:%d\n",getpid());
//    sleep(1);
//
//    //int ret = execl("/usr/bin/ls","ls","-l","-a",NULL);
//    //int ret = execl("/usr/bin/lsdd","ls","-l",NULL);//执行不存在的命令
//    //int ret = execl("/usr/bin/pwd","pwd",NULL);
//    int ret = execl("./code","code",NULL);
//    printf("运行结束了！ret = %d \n",ret);
//
//    return 15;
//}
















//int main()
//{
//    printf("Hello,Xiaodu!");
//    int flag=1;
//    if(flag)
//        exit(1);
//    exit(0);
//}
//int print()
//{
//    printf("print函数调用开始了!\n");
//    int flag=1;
//    if(flag)
//        exit(1);
//    printf("print函数调用结束了！\n");
//    return 0;
//}
//
//int main()
//{
//    printf("程序开始了！\n");
//    int ret = print();
//    printf("程序结束了！\n");
//    return 0;
//}
//


//int main()
//{
//    printf("Hello xiaodu!\n");
//    return 0;
//}
